package com.itservice.supporter_navi.MarathonDataBase;

import java.util.ArrayList;

import android.content.Context;
import android.util.Log;

import com.google.android.maps.GeoPoint;
import com.itservice.supporter_navi.MarathonDataBase.libs.Convention;
import com.itservice.supporter_navi.MarathonDataBase.libs.DBUtilities;
import com.itservice.supporter_navi.MarathonDataBase.libs.MarathonCourseData;
import com.itservice.supporter_navi.MarathonDataBase.libs.SharedPreferencesWrapper;
import com.itservice.supporter_navi.utilities.CommonUtilities;

public class MarathonDataBase extends SharedPreferencesWrapper {
	private MarathonCourseData courseData; // マラソンコース情報
	static private MarathonDataBase marathonDB;

	static public MarathonDataBase getInstance()
	{
		if(null == marathonDB)
		{
			marathonDB = new MarathonDataBase();
		}
		return marathonDB;
	}

    private MarathonDataBase() {
    	super();
    }

    //////////////////////
    // コンテキスト設定 //
    //////////////////////
    @Override
	public void setContext(Context context)
    {

    	super.setContext(context);
//        Log.v("MarathonApplication", "MarathonDataBase:" + context);

        // マラソンマップデータの取得
        courseData = MarathonCourseData.getInstance(context.getResources());

    }
    ////////////////////////////
    // マラソンデータ関係     //
    ////////////////////////////
    /**
     * マラソン大会リスト情報を返す。
     * @return
     */
    public ArrayList<Convention> GetConventionList()
    {
    	return courseData.GetConventionList();
    }

    /**
     * マラソン大会番号を設定する。
     * @param no
     * @return
     */
    public Boolean SetConvention(int no)
    {
    	return courseData.SetConvention(no);
    }

	// コース内のポイント位置の数を返す。
	// 大会未設定や、コースデータがない場合は0を返す。
	public int GetCourseMaxPointNum()
	{
		return courseData.GetCourseMaxPointNum();
    }

	// 設定された大会番号のコースデータを
	// 引数のNoによって値を返す。
	public GeoPoint GetCourseData(int index)
	{
		return courseData.GetCourseData(index);
	}

	// 設定された大会番号のコースデータの緯度を
	// 引数のNoによって値を返す。
	public double GetCourseDataLatitude(int index)
	{
		return courseData.GetCourseDataLatitude(index);
	}

	// 設定された大会番号のコースデータの経度を
	// 引数のNoによって値を返す。
	public double GetCourseDataLangitude(int index)
	{
		return courseData.GetCourseDataLangitude(index);
	}

	// 設定された大会番号のコースデータの角度を
	// 引数のindexによって値を返す。
	public int GetCourseDataAngle(int index)
	{
		return courseData.GetCourseDataAngle(index);
	}

	// コース内のポイント位置の数を返す。
	// 大会未設定や、コースデータがない場合は0を返す。
	public int GetDistanceMaxPointNum()
	{
		return courseData.GetDistanceMaxPointNum();
	}

	// 設定された大会番号の距離表示情報データの緯度を
	// 引数のNoによって値を返す。
	public double GetDistanceDataLatitude(int index)
	{
		return courseData.GetDistanceDataLatitude(index);
	}

	// 設定された大会番号の距離表示情報データの経度を
	// 引数のNoによって値を返す。
	public double GetDistanceDataLangitude(int index)
	{
		return courseData.GetDistanceDataLangitude(index);
	}

	// 設定された大会番号の距離表示情報データのタイトルを
	// 引数のindexによって値を返す。
	public String GetDistanceDataTitle(int index)
	{
		return courseData.GetDistanceDataTitle(index);
	}

	// 設定された大会番号の距離表示情報データのコメントを
	// 引数のindexによって値を返す。
	public String GetCourseDataComment(int index)
	{
		return courseData.GetDistanceDataComment(index);
	}

    ///////////////////////////
    // SharedPreference 関係 //
    ///////////////////////////
    /**
     * テキストの保存
     */
    public void setText(String key, String text) {
        this._set(key, text);
    }

    /**
     * テキストの保存 int型
     */
    public void setInteger(String key, int data) {
    	String text = Integer.toString(data);
        this._set(key, text);
    }

    /**
     * テキストの保存 long型
     */
    public void setLong(String key, long data) {
    	String text = Long.toString(data);
        this._set(key, text);
    }

    /**
     * テキストの保存 double型
     */
    public void setDouble(String key, double data) {
    	String text = Double.toString(data);
        this._set(key, text);
    }

    /**
     * テキストの保存 Boolean型
     */
    public void setBoolean(String key, Boolean data) {
    	String text = Boolean.toString(data);
        this._set(key, text);
    }

    /**
     * 保存されているデータの取得 String型
     */
    public String getText(String key, String defaultkey) {
    	if(defaultkey == null)
    	{
    		defaultkey = "";
    	}
        return this._get(key , defaultkey);
    }

    /**
     * 保存されているデータの取得 Integer型
     */
    public int getInteger(String key , int defaultkey) {

    	String retStr = this._get(key, String.valueOf(defaultkey));
    	if(retStr.equals(String.valueOf(defaultkey)))
    	{
    		return defaultkey;
    	}
    	else
    	{
            return Integer.parseInt(retStr);
    	}
    }

    /**
     * 保存されているデータの取得 long型
     */
    public long getLong(String key , long defaultkey) {

    	String retStr = this._get(key, String.valueOf(defaultkey));
    	if(retStr.equals(String.valueOf(defaultkey)))
    	{
    		return defaultkey;
    	}
    	else
    	{
            return Long.parseLong(retStr);
    	}
    }


    /**
     * 保存されているデータの取得 Double型
     */
    public double getDouble(String key , double defaultkey) {

    	String retStr = this._get(key, String.valueOf(defaultkey));
    	if(retStr.equals(String.valueOf(defaultkey)))
    	{
    		return defaultkey;
    	}
    	else
    	{
            return Double.parseDouble(retStr);
    	}
    }

    /**
     * 保存されているデータの取得 Boolean型
     */
    public boolean getBoolean(String key , boolean defaultkey) {

    	String retStr = this._get(key, String.valueOf(defaultkey));
    	if(retStr.equals(String.valueOf(defaultkey)))
    	{
    		return defaultkey;
    	}
    	else
    	{
            return Boolean.parseBoolean(retStr);
    	}
    }

    /**
     * 保存されているテキストデータを削除
     */
    public void removeText(String key) {
        this._remove(key);
    }

    /**
     * プリファレンス内に同等のフレンドIDがあるか検索する。
     * @param id 検索したいフレンドID
     * @return 検索結果：存在した場合：登録されているNo、存在していない場合：-1
     */
    public int friendIdSearch(String id)
    {
		int reg_cnt = getInteger(DBUtilities.FRIEND_NUM, 0);
		for(int i=1; i<=reg_cnt; i++){
			String Reg_ID = getText(DBUtilities.FRIEND_ID+i, "");
			Log.v(CommonUtilities.LOG_TAG,"Cnt[" + i + "]ID:" + Reg_ID);
			if(Reg_ID.equals(id)){
				return i-1;
			}
		}

		Log.v(CommonUtilities.LOG_TAG,"friendIdSearch Error");
		return -1;
    }

}